const path = require('path');
const webpack = require('webpack');
const AntDesignThemePlugin = require('antd-theme-webpack-plugin');

module.exports = options => ({
    mode: options.mode,
    entry: options.entry,
    output: Object.assign(
        {
            // 打包到dist文件
            path: path.resolve(process.cwd(), 'dist'),
            publicPath: '/',
        },
        options.output,
    ),
    optimization: options.optimization,
    module: {
        rules: [
            {
                test: /\.jsx?$/, // 使用Babel转换所需的所有.js和.jsx文件
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: options.babelQuery,
                },
            },
            {
                // 预处理.css文件
                test: /\.css$/,
                exclude: /node_modules/,
                use: ['style-loader', 'css-loader'],
            },
            {
                // 预处理node_modules中的第三方.css文件
                test: /\.css$/,
                include: /node_modules/,
                use: ['style-loader', 'css-loader'],
            },
            {
                // 预处理node_modules中的第三方.less文件
                test: /\.less$/,
                include: /node_modules/,
                use: [
                    {
                        loader: 'style-loader',
                    },
                    {
                        loader: 'css-loader',
                    },
                    {
                        loader: 'less-loader',
                        options: {
                            // 这里需要在less的配置规则里打开javascriptEnabled
                            javascriptEnabled: true,
                        },
                    },
                ],
            },
            {
                test: /\.(eot|otf|ttf|woff|woff2)$/,
                use: 'file-loader',
            },
            {
                test: /\.svg$/,
                use: [
                    {
                        loader: 'svg-url-loader',
                        options: {
                            // 小于10 kB的内联文件
                            limit: 10 * 1024,
                            noquotes: true,
                        },
                    },
                ],
            },
            {
                test: /\.(jpg|png|gif)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            // 小于10 kB的内联文件
                            limit: 10 * 1024,
                        },
                    },
                    {
                        loader: 'image-webpack-loader',
                        options: {
                            mozjpeg: {
                                enabled: false,
                            },
                            gifsicle: {
                                interlaced: false,
                            },
                            optipng: {
                                optimizationLevel: 7,
                            },
                            pngquant: {
                                quality: '65-90',
                                speed: 4,
                            },
                        },
                    },
                ],
            },
            {
                test: /\.html$/,
                use: 'html-loader',
            },
            {
                test: /\.(mp4|webm)$/,
                use: {
                    loader: 'url-loader',
                    options: {
                        limit: 10000,
                    },
                },
            },
        ],
    },
    plugins: options.plugins.concat([
        // 始终将NODE_ENV公开给webpack，
        // 以便在代码中使用“process.ENV.NODE_ENV”进行任何环境检查；
        new webpack.EnvironmentPlugin({
            NODE_ENV: 'development',
        }),
        // antd 主题配置
        new AntDesignThemePlugin({
            antDir: path.join(__dirname, '../../node_modules/antd'),
            stylesDir: path.join(__dirname, '../../app/static/theme'),
            varFile: path.join(__dirname, '../../app/static/theme/variables.less'),
            indexFileName: 'index.html',
            mainLessFile: path.join(__dirname, '../../app/static/theme/index.less'),
            themeVariables: ['@primary-color', '@btn-primary-bg', '@link-color'],
            lessUrl: 'https://cdn.bootcdn.net/ajax/libs/less.js/2.7.2/less.min.js',
            publicPath: '',
        }),
    ]),
    resolve: {
        // 配置 Webpack 去哪些目录下寻找第三方模块，默认是只会去  node_modules 目录下寻找
        modules: ['node_modules', 'app'],
        // 在导入语句没带文件后缀时，Webpack 会自动带上后缀后去尝试访问文件是否存在。 
        extensions: ['.js', '.jsx', '.react.js'],
        // 有一些第三方模块会针对不同环境提供几分代码。优先采用顺序：浏览器、ES6、ES5
        mainFields: ['browser', 'jsnext:main', 'main'],
    },
    devtool: options.devtool,
    target: 'web', // 使webpack可访问web变量，例如 window
    performance: options.performance || {},
});